#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=305,mod=1e9+7;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-48,ch=getchar();}
	return x*f;
}
int n,m,a[N][N],C[N][N],dv[N];
string s;
int ans;

bool vis[N][N];
void dfs(int x,int y){
	if(x==n+1){
		ans++;
		return;
	}
	if(vis[x][y]){
		y==m?dfs(x+1,1):dfs(x,y+1);
		return;
	}
	vis[x][y]=1;
	y==m?dfs(x+1,1):dfs(x,y+1);
	int col=a[x][y],pos=n;
	for(int i=x+1;i<=n;i++){
		if(a[i][y]==col&&!vis[i][y]){
			vis[i][y]=1;
			y==m?dfs(x+1,1):dfs(x,y+1);
		}
		else{
			pos=i-1;
			break;
		}
	}
	for(int i=x+1;i<=pos;i++) vis[i][y]=0;

	pos=m;
	for(int i=y+1;i<=m;i++){
		if(a[x][i]==col&&!vis[x][i]){
			vis[x][i]=1;
			y==m?dfs(x+1,1):dfs(x,y+1);
		}
		else{
			pos=i-1;
			break;
		}
	}
	for(int i=y+1;i<=pos;i++) vis[x][i]=0;

	vis[x][y]=0;
	return;	
}

signed main(){
	freopen("disanti.in","r",stdin);
	freopen("disanti.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		cin>>s;
		for(int j=1;j<=m;j++)
			a[i][j]=s[j-1];
	}
	if(n==1){
		C[0][0]=1;
		for(int i=1;i<=m;i++){
			C[i][0]=1;
			for(int j=1;j<=i;j++)
				C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
		}
		for(int i=1;i<=m;i++){
			dv[i]=0;
			for(int j=1;j<=i;j++)
				dv[i]=(dv[i]+C[i-1][j-1])%mod;
		}
		a[1][m+1]=-1;
		for(int i=1;i<=m;i++){
			a[1][i]^=1;
			int sum=0,ans=1;
			for(int j=1;j<=m;j++){
				sum++;
				if(a[1][j]!=a[1][j+1]){
					ans=ans*dv[sum]%mod;
					sum=0;
				}
			}
			a[1][i]^=1;
			printf("%lld ",ans);
		}
	}
	else{
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				a[i][j]^=1;
				ans=0;
				dfs(1,1);
				printf("%lld ",ans);
				a[i][j]^=1;
			}
			printf("\n");
		}
	}
	return 0;
}
